﻿/***********************************************************************************\
| Copyright (c) 2011, Bashar Al-Rawi                                                |
| All rights reserved.                                                              |
|                                                                                   |
| Redistribution and use in source and binary forms, with or without                |
| modification, are permitted provided that the following conditions are met:       |
|    * Redistributions of source code must retain the above copyright               |
|      notice, this list of conditions and the following disclaimer.                |
|    * Redistributions in binary form must reproduce the above copyright            |
|      notice, this list of conditions and the following disclaimer in the          |
|      documentation and/or other materials provided with the distribution.         |
|    * Neither the name of the <organization> nor the                               |
|      names of its contributors may be used to endorse or promote products         |
|      derived from this software without specific prior written permission.        |
|                                                                                   |
| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND   |
| ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED     |
| WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE            |
| DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY                |
| DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES        |
| (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;      |
| LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND       |
| ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT        |
| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS     |
| SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.                      |
\***********************************************************************************/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using System.Diagnostics;
using System.Threading;
using Microsoft.Phone.Tasks;
using System.Text;
using Arabic.Controls;
using Microsoft.Phone.Shell;
using Arabic.Utils;
using System.Windows.Media.Imaging;
using System.Reflection;


namespace Arabic.Search
{
    public partial class MainPage : PhoneApplicationPage
    {
        private bool IsFirstSearch
        {
            get
            {
                return ApplicationGlobals.ApplicationPersistedSettings.GetValue<bool>("IsFirstSearch");
            }
        }

        private void SetFirstSearch()
        {
            ApplicationGlobals.ApplicationPersistedSettings.AddOrUpdateValue("IsFirstSearch", true);
            ApplicationGlobals.ApplicationPersistedSettings.Save();
        }

        // Constructor
        public MainPage()
        {
            InitializeComponent();
            ApplicationGlobals.Instance.Orientation = this.Orientation;
            this.keyboard.FirstInitialize();
            Assembly assembly = Assembly.GetExecutingAssembly();
            string assemblyName = assembly.FullName.Substring(0, assembly.FullName.IndexOf(','));
            bgImage.ImageSource = new BitmapImage(new Uri(string.Format("/{0};component/Images/SofiP.jpg", assemblyName), UriKind.Relative));
            //Application.Current.Host.Settings.EnableFrameRateCounter = true;
            //Application.Current.Host.Settings.EnableRedrawRegions = true;

        }

        private void Scroll(double value)
        {
            this.SlideKeyFrame.Value = value;
            this.ScrollTextStoryboard.Begin();
        }

        private void keyboard_KeyboardShow(object sender, EventArgs e)
        {
            this.Scroll(this.keyboard.Height);
            this.textBlock.FocusText();
        }

        private void keyboard_KeyboardHide(object sender, EventArgs e)
        {
            this.Scroll(0);
            this.textBlock.Defocus();
        }

        private void PhoneApplicationPage_OrientationChanged(object sender, OrientationChangedEventArgs e)
        {
            ApplicationGlobals.Instance.Orientation = e.Orientation;
            grid1.RowDefinitions[0].Height = new GridLength(ApplicationGlobals.Height);
            Assembly assembly = Assembly.GetExecutingAssembly();
            string assemblyName = assembly.FullName.Substring(0, assembly.FullName.IndexOf(','));
            if ((e.Orientation & PageOrientation.Landscape) != 0)
            {
                bgImage.ImageSource = new BitmapImage(new Uri(string.Format("/{0};component/Images/SofiL.jpg", assemblyName), UriKind.Relative));
                this.textBlock.Width = 700;
            }
            else
            {
                bgImage.ImageSource = new BitmapImage(new Uri(string.Format("/{0};component/Images/SofiP.jpg", assemblyName), UriKind.Relative));
                this.textBlock.Width = 440;
            }
            if (SIP.Instance.Visible)
            {
                this.keyboard.Hide();
            }
            UpdateTextLayout();
        }

        private void UpdateTextLayout()
        {
            this.textBlock.Update();
        }

        private void Search()
        {
            string rawText = this.textBlock.RawText;
            if (!string.IsNullOrEmpty(rawText))
            {
                if (!IsFirstSearch)
                {
                    MessageBoxResult result = MessageBox.Show(
                        "ستظهر الحروف العربية هنا بالعكس. إهملها رجاء",
                        "ابحث",
                        MessageBoxButton.OK);
                    SetFirstSearch();
                }
                string url = @"http://www.bing.com/search?q=" + Uri.EscapeDataString(HttpUtility.UrlEncode(textBlock.RawText));
                string nav = string.Format("/BrowserPage.xaml?url={0}", url);
                NavigationService.Navigate(new Uri(nav, UriKind.Relative));
                
                /* if we want to go the Google route
                 *WebBrowserTask task = new WebBrowserTask();
                task.URL = @"http://www.google.com?q=" + Uri.EscapeDataString(HttpUtility.UrlEncode(textBlock.RawText));
                task.Show();
                 */
                //new SearchTask() { SearchQuery = rawText }.Show();
            }
        }

        private void sendButton_Click(object sender, EventArgs e)
        {
            Search();
        }

        private void PhoneApplicationPage_BackKeyPress(object sender, System.ComponentModel.CancelEventArgs e)
        {
            if (SIP.Instance.Visible)
            {
                e.Cancel = true;
                this.keyboard.Dismiss();
            }
            else
            {
                NavigationService.GoBack();
            }
        }

        public void Key_LaunchSearch(object sender, KbdEventArgs e)
        {
            // e is null in case the event is ignored
            if (e != null)
            {
                // Launch search for the specified keyword
                if (e.PlatformkeyCode == Character.ENTER)
                {
                    Search();
                    e.Handled = true;
                }
            }
        }


        private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
        {
            this.keyboard.InitializeKeyboard();
            this.keyboard.KeyboardHide += new EventHandler(keyboard_KeyboardHide);
            this.keyboard.KeyboardShow += new EventHandler(keyboard_KeyboardShow);
            this.keyboard.KeyUp += new Arabic.Controls.Key.KeyDownEventHandler(Key_LaunchSearch);

            this.OrientationChanged += keyboard.Keyboard__OrientationChanged;
            this.textBlock.SetKeyboard(this.keyboard);
            this.textBlock.DeSerialize(this.Name + "_" + this.textBlock.Name + ".dat");
            UpdateTextLayout();
            PhoneApplicationService.Current.Deactivated += new EventHandler<DeactivatedEventArgs>(Current_Deactivated);
        }

        void Current_Deactivated(object sender, DeactivatedEventArgs e)
        {
            this.textBlock.Serialize(this.Name + "_" + this.textBlock.Name + ".dat");
        }

        private void PhoneApplicationPage_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            if (SIP.Instance.Visible && e.GetPosition(keyboard).Y < 0)
            {
                e.Handled = true;
                this.keyboard.Dismiss();
            }

        }

    }
}
